#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
#include<bitset>
#include<math.h>
using namespace std;


void GetMinMax(int v1,int v2,int v3,int v4,int ips[][4]){
    if(    (v1<ips[0][0]) 
        || (v1==ips[0][0] && v2 < ips[0][1])
        || (v1==ips[0][0] && v2 == ips[0][1] && v3<ips[0][2])
        || (v1==ips[0][0] && v2 == ips[0][1] && v3==ips[0][2] && v4<ips[0][3])){
         ips[0][0] = v1;
            ips[0][1] = v2;
            ips[0][2] = v3;
            ips[0][3] = v4;
    }
    else if((v1>ips[1][0]) 
        || (v1==ips[1][0] && v2 > ips[1][1])
        || (v1==ips[1][0] && v2 == ips[1][1] && v3>ips[1][2])
        || (v1==ips[1][0] && v2 == ips[1][1] && v3==ips[1][2] && v4>ips[1][3])){
        ips[1][0] = v1;
        ips[1][1] = v2;
        ips[1][2] = v3;
        ips[1][3] = v4;
    }
}

// 用来计算掩码可行
int GetPrifex(string s){
    int ans = 0;
    bool flag = true;
    for(int i=0;i<s.size();i++){
        if(s[i] == '0'){
            flag = false;
            break;
        }
        if(s[i]=='1' && flag){
            ans += pow(2,s.size()-i-1);
        }
    }
    return ans;
}


int GetAfter(string s){
    bool flag = true;
    int ans = 0;
    for(int i=s.size()-1;i>=0;i--){
        if(s[i] == '0' && flag){
            flag = false;
        }
        if(s[i]=='1' && !flag){
            ans += pow(2,s.size()-i-1); 
        }
    }
    return ans;
}

// IP掩码，此时应该最大IP地址和最小IP地址做同或 先做异或^ 再做同或
// 相同为1，不同为0，按位同或运算进行输出
void GetAnsFromArr(int ips[][4]){
    string s1="",s2="";    
    bool flag = true,after = false;
    for(int i=0;i<4;i++){
        if(ips[0][i]!=ips[1][i]){
            flag = false;
        }
        if(flag){
            // 此时都还是相同的
            s1 += to_string(bitset<8>(ips[0][i] & ips[1][i]).to_ulong());
            s2 += to_string(bitset<8>(~(ips[0][i] ^ ips[1][i])).to_ulong());
        } else if( !flag && !after) {
            // 此时不同，则为0后面的都变成0
            string v1 = bitset<8>(ips[0][i] & ips[1][i]).to_string();
            string v2 = bitset<8>(~(ips[0][i] ^ ips[1][i])).to_string();
            
            s1 += to_string(GetAfter(v1));

            
            s2 += to_string(GetPrifex(v2));
            after = true;
        }
        else if(after){
            s1 += '0';
            s2 += '0';
        }
        if(i < 3){
            s1 += ".";
            s2 += ".";
        }
    }
    cout<<s1<<endl<<s2<<endl;
}


int main(){

    // freopen("./out.txt", "w", stdout);

    int ips[2][4] = {0};
    int m;
    while(cin>>m){
        for(int i=0;i<m;i++){
            int v1,v2,v3,v4;
            scanf("%d.%d.%d.%d",&v1,&v2,&v3,&v4);
            if(i == 0){
                ips[0][0] = v1;
                ips[0][1] = v2;
                ips[0][2] = v3;
                    ips[0][3] = v4;
                ips[1][0] = v1;
                ips[1][1] = v2;
                ips[1][2] = v3;
                ips[1][3] = v4;
            } else {
                GetMinMax(v1,v2,v3,v4,ips);
            }
        }
        GetAnsFromArr(ips);
    }
   
    

    return 0;   
}
